package com.cimu.activemq.config;

import com.cimu.activemq.constants.Constants;
import org.apache.activemq.RedeliveryPolicy;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;

/**
 * Title: ActiveMqConfig
 * Copyright: Copyright (c) 2017
 *
 * date 2018年12月09日 14:06
 */
@Configuration
public class ActiveMqConfig {

    @Bean(name = "demoQueue")
    public Queue demoQueue() {
        return new ActiveMQQueue(Constants.DEMO_QUEUE);
    }

    @Bean(name = "oneQueue")
    public Queue oneQueue() {
        return new ActiveMQQueue(Constants.ONE_QUEUE);
    }

    @Bean(name = "demoTopic")
    public Topic demoTopic() {
        return new ActiveMQTopic(Constants.DEMO_TOPIC);
    }

    /**
     *  设置订阅消息
     * @param connectionFactory ConnectionFactory
     * @return JmsListenerContainerFactory
     */
    @Bean
    public JmsListenerContainerFactory<?> topicContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory simpleJmsListenerContainerFactory = new SimpleJmsListenerContainerFactory();
        simpleJmsListenerContainerFactory.setConnectionFactory(connectionFactory);
        //开启订阅模式
        simpleJmsListenerContainerFactory.setPubSubDomain(true);
        //开启持久化订阅,订阅端不在线能保持未消费的消息
        simpleJmsListenerContainerFactory.setClientId("cimu");
        simpleJmsListenerContainerFactory.setSubscriptionDurable(true);
        return simpleJmsListenerContainerFactory;
    }

    @Bean
    public RedeliveryPolicy redeliveryPolicy(){
        RedeliveryPolicy  redeliveryPolicy=   new RedeliveryPolicy();
        //是否在每次尝试重新发送失败后,增长这个等待时间
        redeliveryPolicy.setUseExponentialBackOff(true);
        //重发次数,默认为6次   这里设置为10次
        redeliveryPolicy.setMaximumRedeliveries(10);
        //重发时间间隔,默认为1秒
        redeliveryPolicy.setInitialRedeliveryDelay(1);
        //第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value
        redeliveryPolicy.setBackOffMultiplier(2);
        //是否避免消息碰撞
        redeliveryPolicy.setUseCollisionAvoidance(false);
        //设置重发最大拖延时间-1 表示没有拖延只有UseExponentialBackOff(true)为true时生效
        redeliveryPolicy.setMaximumRedeliveryDelay(-1);
        return redeliveryPolicy;
    }

    @Bean
    public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory){
        JmsTemplate jmsTemplate=new JmsTemplate();
        //进行持久化配置 1表示非持久化，2表示持久化
        jmsTemplate.setDeliveryMode(2);
        jmsTemplate.setConnectionFactory(connectionFactory);
        //客户端签收模式
        jmsTemplate.setSessionAcknowledgeMode(4);
        return jmsTemplate;
    }

}
